package com.it.you.base.map;

import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Map;

/**
 * 实时监控HashMap的容量capacity以及阈值threshold的变化
 * 容量：是取大于等于参数的最小2次幂，如果这个最小二次幂小于16的话也是取值16，这个源码中有写
 * 阈值：在初始化的时候，阈值是等于容量的；当放入第一个元素后，重新计算阈值，新的阈值=容量X负载因子
 *
 */
public class MapTest2 {
    public static void main(String[] args) throws Exception {
        Map<Integer, Integer> map = new HashMap<>();
//        HashMap map = new HashMap(15);
        Class<? extends Map> mapClass = map.getClass();
        //获取指定属性，也可以调用getDeclaredFields()方法获取属性数组
        Field threshold = mapClass.getDeclaredField("threshold");
        //将目标属性设置为可以访问
        threshold.setAccessible(true);
        //获取指定方法，因为HashMap没有容量这个属性，但是capacity方法会返回容量值
        Method capacity = mapClass.getDeclaredMethod("capacity");
        //设置目标方法为可访问
        capacity.setAccessible(true);
        //打印刚初始化的HashMap的容量、阈值和元素数量
        System.out.println("容量：" + capacity.invoke(map) + "    阈值：" + threshold.get(map) + "    元素数量：" + map.size());
        for (int i = 0; i < 17; i++) {
            map.put(i, i);
            //动态监测HashMap的容量、阈值和元素数量
            System.out.println("容量：" + capacity.invoke(map) + "    阈值：" + threshold.get(map) + "    元素数量：" + map.size());
        }
    }
}
